新たなJavaScript/TypeScriptランタイム Denoを触ってみた
こんにちは。サービスグループの武田です。
JavaScriptはブラウザ上で動作するものというイメージもNode.jsの登場によって変化してきました。現在ではフロントエンドの開発には欠かせないものとなっていますし、AWS界隈でもAmplifyやCDKなどでお世話になっている方も多いのではないでしょうか。
さて、そんなJavaScript界隈にまた新しい波が到来しそうです。新たなJavaScript/TypeScriptランタイムとしてDenoが先日リリースされました。ちなみに「ディーノ」と読むらしいです。
v1.0.0 released! https://t.co/LYnmPEHgq2
— Deno (@deno_land) May 13, 2020
さっそくインストールから実行まで試してみました。
Denoの特徴
Denoは次のような特徴を持ちます。
- エンジンとしてV8を採用し、Rustで構築されたランタイム
- サンドボックスで動作し、ファイルやネットワークアクセスには明示的な許可が必要
- TypeScriptをネイティブサポート
- インストールは単一バイナリのみ
- 依存関係インスペクタやコードフォーマッタを組込み機能で提供
- 標準モジュールを提供
環境
次のような環境で検証しています。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.4 BuildVersion: 19E287 $ echo $BASH_VERSION 5.0.17(1)-release
環境構築
Denoをインストール方法はいくつか提供されています。macOSであればHomebrew、WindowsであればChocolateyなどのパッケージマネージャーがサポートされています。またRust製のためcargoでもインストール可能です。今回はオーソドックスにインストールスクリプトを使用してみました。
macOSやLinuxであれば次のコマンドで最新バージョンがインストールできます。
$ curl -fsSL https://deno.land/x/install/install.sh | sh
ちなみにバージョンを指定することもできます。
curl -fsSL https://deno.land/x/install/install.sh | sh -s v1.0.1
インストールできたら~/.bash_profile
などに次のコマンドを追記しておきましょう。
export DENO_INSTALL="$HOME/.deno" export PATH="$DENO_INSTALL/bin:$PATH" eval "$(deno completions bash)"
なおコマンド補完は次のシェルに対応しているようです。
- zsh
- bash
- fish
- powershell
- elvish
実行してみる
それではDenoでスクリプトを実行してみましょう。eval
で直接スクリプトを指定する方法と、run
で実行ファイルを指定する方法があります。まずはeval
です。
$ deno eval "console.log([...'node'].sort().join(''))" deno
簡単ですね。続いてrun
も試してみます。ローカルファイルの指定もできますし、URLの指定もできます。
$ deno run https://deno.land/std/examples/welcome.ts Welcome to Deno ?
恐竜がお茶目ですね。ローカルサーバーを起動するスクリプトも試してみましょう。
import { serve } from "https://deno.land/std@0.52.0/http/server.ts"; const s = serve({ port: 8008 }); console.log("http://localhost:8008/"); for await (const req of s) { req.respond({ body: "Hello World\n" }); }
実行時にnetを許可する必要があります。また必要なモジュールは初回実行時に自動でダウンロードしてくれます。
$ deno run --allow-net server.ts http://localhost:8008/
別のターミナルでアクセスしてみます。
$ curl http://localhost:8008/ Hello World
TypeScriptのコードも簡単に実行できました。すばらです。
まとめ
まずはインストールしていくつかのスクリプトを実行してみました。インストール自体も簡単ですし、TypeScriptのスクリプトも簡単に実行できました。いきなりNode.jsを置き換えるものではありませんが、興味を持ってウォッチしていきたいです。